﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QuanLyHocPhi.GUI.DuLieu
{
    using Model;
    using BLL;
    using QuanLyHocPhi.BLL.Excel;
    /// <summary>
    /// Form nạp dữ liệu sinh viên không chuyên
    /// </summary>
    public partial class FormSinhVien_Import : Form
    {
        public FormSinhVien_Import()
        {
            InitializeComponent();
        }

        public string LastMaLoaiHinhDaoTao
        {
            get
            {
                if (cbxLoaiHinh.SelectedItem != null)
                    return cbxLoaiHinh.SelectedItem.ToString();
                else
                    return null;
            }
        }

        public string LastNamTuyenSinh
        {
            get
            {
                return txtNamTuyenSinh.Text.Trim();
            }
        }

        public bool SuccessfullyImported
        {
            get;
            private set;
        }

        private void FormSinhVien_Import_Load(object sender, EventArgs e)
        {
            try
            {
                txtStartCell.Text = Properties.Settings.Default.OBatDau;
                txtEndCell.Text = Properties.Settings.Default.OKetThuc;
            }
            catch
            { }

            #region Nạp danh sách loại hình đào tạo
            var lst = BLL.BizLoaiHinhDaoTao.GetListLoaiHinhDaoTao();
            cbxLoaiHinh.DisplayMember = "TenLoaiHinh";
            cbxLoaiHinh.DataSource = lst;
            #endregion

            #region Cấu hình gridSinhVien
            colSinhVien_MaSinhVien.DataPropertyName = BizSinhVien.Col_MaSinhVien;
            colSinhVien_HoDem.DataPropertyName = BizSinhVien.Col_HoDem;
            colSinhVien_Ten.DataPropertyName = BizSinhVien.Col_Ten;
            colSinhVien_NgaySinh.DataPropertyName = BizSinhVien.Col_NgaySinh;
            colSinhVien_GioiTinh.DataPropertyName = BizSinhVien.Col_GioiTinh;
            colSinhVien_GhiChu.DataPropertyName = BizSinhVien.Col_GhiChu;
            ColSinhVien_TrangThai.DataPropertyName = BizSinhVien.Col_TrangThai;
            colSinhVien_IsImported.DataPropertyName = BizSinhVien.Col_ImportThanhCong;
            gridSinhVien.AllowUserToAddRows = false;
            gridSinhVien.AllowUserToDeleteRows = false;
            gridSinhVien.AutoGenerateColumns = false;
            #endregion
            bsSinhVien.DataSource = null;
            gridSinhVien.DataSource = bsSinhVien;
            SuccessfullyImported = false;
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #region private string FileName;
        private string m_FileName;
        private string FileName
        {
            get { return m_FileName; }
            set
            {
                m_FileName = value;
                txtFileName.Text = m_FileName;
                NapDanhSachSheet();
            }
        }
        #endregion

        #region Nạp thông tin của nguồn dữ liệu
        private void lnkRefreshSheetList_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            NapDanhSachSheet();
        }

        private void NapDanhSachSheet()
        {
            try
            {
                if (this.FileName.IsNullOrEmpty())
                    throw new Exception("Chưa xác định tập tin Excel");
                if (System.IO.File.Exists(this.FileName) == false)
                    throw new Exception(string.Format("Tập tin {0} không tồn tại", this.FileName));

                ExcelImporter excel = new ExcelImporter(this.FileName);
                var lst = excel.GetTableList();
                var lst2 = new List<string>();
                foreach (var item in lst)
                {
                    var item2 = item;
                    item2 = item.Replace("'", "");
                    if (item2.EndsWith("$Print_Titles")
                        || item2.EndsWith("$_FilterDatabase")
                        || item2.EndsWith("_"))
                        continue;
                    if (item2.EndsWith("$"))
                        item2 = item2.Remove(item2.Length - 1);
                    lst2.Add(item2);
                }
                bsSheet.DataSource = lst2;
                cbxSheet.DataSource = bsSheet;
                cbxSheet.Enabled = bsSheet.Count > 0;
                bsSinhVien.DataSource = null;
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }
        #endregion

        private void lnkSelectFile_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "Tập tin Excel (*.xls)|*.xls|Tất cả (*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                this.FileName = dlg.FileName;
            }
        }

        private void btnDocDuLieu_Clicked(object sender, EventArgs e)
        {
            // Lấy thông tin sheetName, startCell, endCell
            string sheetName = null;
            if (cbxSheet.SelectedValue != null)
                sheetName = cbxSheet.SelectedValue.ToString();
            string startCell = txtStartCell.Text.Trim();
            string endCell = txtEndCell.Text.Trim();

            if (sheetName.IsNullOrEmpty())
            {
                DialogUtils.ShowError("Phải chọn sheet để nạp dữ liệu!");
                return;
            }

            // Xử lý dữ liệu
            try
            {
                gridSinhVien.DataSource = null;
                btnNapDuLieu.Enabled = false;

                ExcelImporter excel = new ExcelImporter(this.FileName);
                DataTable dt = excel.ReadData(sheetName: sheetName, headerEnable: true, startCell: startCell, endCell: endCell);
                var datacolumns = dt.Columns;
                bool coDayDuCacCot =
                    datacolumns.Contains(BizSinhVien.Col_MaSinhVien) &&
                    datacolumns.Contains(BizSinhVien.Col_HoDem) &&
                    datacolumns.Contains(BizSinhVien.Col_Ten) &&
                    datacolumns.Contains(BizSinhVien.Col_NgaySinh) &&
                    datacolumns.Contains(BizSinhVien.Col_GioiTinh);
                if (coDayDuCacCot)
                {
                    if (dt.Columns.Contains(BizSinhVien.Col_TrangThai) == false)
                        dt.Columns.Add(BizSinhVien.Col_TrangThai, typeof(string));
                    foreach (DataRow row in dt.Rows)
                    {
                        row[BizSinhVien.Col_TrangThai] = BizSinhVien.ImportStatus.IN_OK;
                        var maSinhVien = Convert.ToString(row[BizSinhVien.Col_MaSinhVien]);
                        var hoDem = Convert.ToString(row[BizSinhVien.Col_HoDem]);
                        var ten = Convert.ToString(row[BizSinhVien.Col_Ten]);
                        var ngaySinh = Convert.ToString(row[BizSinhVien.Col_NgaySinh]);
                        #region var gioiTinh = ...;
                        var gioiTinh = Convert.ToString(row[BizSinhVien.Col_GioiTinh]);
                        if (gioiTinh.IsNullOrEmpty())
                            gioiTinh = "Nam";
                        gioiTinh = gioiTinh.ToUpper();
                        if (gioiTinh == "NAM" || gioiTinh == "X")
                            gioiTinh = "TRUE";
                        else
                            gioiTinh = "FALSE";
                        try
                        {
                            var bGioiTinh = Convert.ToBoolean(gioiTinh);
                            gioiTinh = Convert.ToString(bGioiTinh);
                        }
                        catch
                        {
                            gioiTinh = "True";
                        }
                        row[BizSinhVien.Col_GioiTinh] = Convert.ToBoolean(gioiTinh);
                        #endregion
                        var ghiChu = Convert.ToString(row[BizSinhVien.Col_GhiChu]);
                        if (
                            maSinhVien.IsNullOrEmpty() ||
                            (hoDem.IsNullOrEmpty() && ten.IsNullOrEmpty())
                            //|| ngaySinh.IsNullOrEmpty() || gioiTinh.IsNullOrEmpty()
                            )
                            row[BizSinhVien.Col_TrangThai] = BizSinhVien.ImportStatus.IN_ERROR_NOT_ENOUGH;
                    }
                    dt.AcceptChanges();

                    btnNapDuLieu.Enabled = true;
                    bsSinhVien.DataSource = dt;
                }
                else
                    throw new Exception("Bảng tính Excel không có định dạng hợp lệ: MaSinhVien, HoDem, Ten, NgaySinh, GioiTinh");
            }
            catch (Exception exc)
            {
                bsSinhVien.DataSource = null;
                DialogUtils.ShowError(exc.Message);
            }
            gridSinhVien.AutoGenerateColumns = false;
            gridSinhVien.ReadOnly = true;
            gridSinhVien.AllowUserToAddRows = false;
            gridSinhVien.DataSource = bsSinhVien;
        }

        private void btnXoaSinhVien_Clicked(object sender, EventArgs e)
        {
            // Xoá sinh viên khỏi danh sách được nạp vào
            bsSinhVien.EndEdit();
            DataTable dt = bsSinhVien.DataSource as DataTable;
            if (dt == null)
                throw new Exception("Chưa xác định được nguồn dữ liệu");
            if (bsSinhVien.Current != null)
            {
                bsSinhVien.RemoveCurrent();
                dt.AcceptChanges();
            }
        }

        private void gridSinhVien_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {           
            foreach (DataGridViewRow row in gridSinhVien.Rows)
            {
                if (row.DataBoundItem == null)
                    return;
                var drow = row.DataBoundItem as DataRowView;
                if (drow == null)
                    return;

                var cell = row.Cells[ColSinhVien_TrangThai.Index] as DataGridViewTextBoxCell;
                if (cell == null)
                    return;
                object oTrangThai = row.Cells[ColSinhVien_TrangThai.Index].Value;
                if (oTrangThai != null && oTrangThai != DBNull.Value)
                {
                    string trangThai = oTrangThai.ToString();
                    if (trangThai.Equals(BizSinhVien.ImportStatus.IN_ERROR) ||
                        trangThai.Equals(BizSinhVien.ImportStatus.IN_ERROR_NOT_ENOUGH))
                    {
                        cell.Style.SelectionForeColor = cell.Style.ForeColor = Color.Brown;
                        //cell.Style.SelectionBackColor = cell.Style.BackColor = Color.LightPink;
                    }
                    else if (trangThai.Equals(BizSinhVien.ImportStatus.IN_OK))
                    {
                        cell.Style.SelectionForeColor = cell.Style.ForeColor = Color.Black;
                        //cell.Style.SelectionBackColor = cell.Style.BackColor = Color.White;
                    }
                    else if (trangThai.Equals(BizSinhVien.ImportStatus.OUT_OK))
                    {
                        cell.Style.SelectionForeColor = cell.Style.ForeColor = Color.DarkGreen;
                        //cell.Style.SelectionBackColor = cell.Style.BackColor = Color.White;
                    }
                    else if (trangThai.Equals(BizSinhVien.ImportStatus.OUT_ERROR_ALREADY_EXIST) ||
                        trangThai.Equals(BizSinhVien.ImportStatus.OUT_ERROR_GENERAL))
                    {
                        cell.Style.SelectionForeColor = cell.Style.ForeColor = Color.Red;
                        //cell.Style.SelectionBackColor = cell.Style.BackColor = Color.LightPink;
                    }
                    else
                    {
                        cell.Style = gridSinhVien.DefaultCellStyle;
                    }
                }
            }
        }

        private void btnCopyCellToClipboard_Clicked(object sender, EventArgs e)
        {
            DataGridViewCell currentCell = gridSinhVien.CurrentCell;
            if (currentCell != null)
            {
                object value = currentCell.Value;
                Clipboard.SetDataObject(value);
            }
            else
                DialogUtils.ShowError("Chọn một ô trước khi thực hiện chức năng này!");
        }

        private void btnNapDuLieu_Clicked(object sender, EventArgs e)
        {
            // Bổ sung sinh viên vào hệ thống
            try
            {
                epMain.Clear();

                #region string tenLopGoc = ...;
                var tenLopGoc = cbxSheet.SelectedItem.ToString();
                if (tenLopGoc.IsNullOrEmpty())
                    throw new Exception("Chưa xác định tên lớp gốc.\nTên lớp gốc được xác định là tên bảng tính Excel (sheet)");
                #endregion

                #region DataTable dt = ...;
                bsSinhVien.EndEdit();
                DataTable dt = null;
                if (bsSinhVien.DataSource != null)
                    dt = bsSinhVien.DataSource as DataTable;
                if (dt == null)
                    throw new Exception("Chưa có dữ liệu sinh viên!");
                #endregion

                #region Model.LoaiHinhDaoTao loaiHinh = ...;
                Model.LoaiHinhDaoTao loaiHinh = null;
                if (cbxLoaiHinh.SelectedItem != null)
                    loaiHinh = cbxLoaiHinh.SelectedItem as Model.LoaiHinhDaoTao;
                if (loaiHinh == null)
                    throw new Exception("Chưa xác định loại hình đào tạo");
                #endregion

                #region string namTuyenSinh = ...;
                var namTuyenSinh = txtNamTuyenSinh.Text.Trim();
                if (namTuyenSinh.IsNullOrEmpty())
                    throw new Exception("Chưa xác định năm tuyển sinh");
                #endregion

                string msg = "";
                Exception error = null;
                var frm = new FormProgress();
                frm.DoWork += (oSender, oE) =>
                {
                    #region Do importing
                    string logDirPath = string.Format("{0}\\LOG", Application.StartupPath);
                    if (System.IO.Directory.Exists(logDirPath) == false)
                        System.IO.Directory.CreateDirectory(logDirPath);
                    var logFilePath = string.Format("{0}\\{1}-{2}-{3}-{4}.tlog",
                        logDirPath,
                        DateTime.Now.ToString("yyyyMMdd-HHmm"), namTuyenSinh, loaiHinh.MaLoaiHinh, tenLopGoc);
                    try
                    {
                        var nInsertedSinhVien = BizSinhVien.NapDuLieuSinhVien(loaiHinh, namTuyenSinh, tenLopGoc, dt, logFilePath);
                        msg = string.Format("Đã nạp được {0}/{1} sinh viên trong danh sách", nInsertedSinhVien, dt.Rows.Count);
                        SuccessfullyImported = true;
                    }
                    catch (Exception exc)
                    {
                        error = exc;

                        string innerException = "";
                        if (exc.InnerException != null)
                            innerException = "\n\n" + exc.InnerException.Message;
                        msg = string.Format("Xuất hiện lỗi trong quá trình nạp dữ liệu sinh viên.\nChi tiết lỗi: {0}{1}",
                            exc.Message, innerException);
                    }
                    #endregion
                };

                frm.RunWorkerCompleted += (oSender, oE) =>
                {
                    #region Do reporting result
                    if (error != null)
                    {
                        DialogUtils.ShowError(msg);
                        //bsSinhVien.DataSource = dt;
                        //gridSinhVien.AutoGenerateColumns = false;
                        //gridSinhVien.DataSource = bsSinhVien;
                    }
                    else
                    {
                        DialogUtils.ShowMessage(msg);
                    }
                    bsSinhVien.ResumeBinding();
                    bsSinhVien.ResetBindings(false);
                    #endregion
                };
                bsSinhVien.SuspendBinding();
                frm.StartWorking(this);
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }

        private void btnNapDuLieuUndo_Clicked(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "*.tlog|*.tlog";
            dlg.InitialDirectory = Application.StartupPath + "\\LOG";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                FormProgress frm = new FormProgress();
                string msg = "";
                frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
                {
                    msg = BizSinhVien.UndoNapDuLieuSinhVien(dlg.FileName);
                };
                frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
                {
                    if (msg.IsNullOrEmpty())
                        msg = "Đã khôi phục thành công";
                    DialogUtils.ShowMessage(msg);
                };
                frm.StartWorking(this);
            }
        }
    }
}
